home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / CarbonizedMenus / source / jGNE.c < prev    next >
Text File  |  1999-06-25  |  3KB  |  113 lines

  1. /****************************************************************************************
  2.     jGNE.c
  3.     
  4.     Copyright © 1999 Red Shed Software. All rights reserved.
  5.     by Jonathan 'Wolf' Rentzsch (jon@redshed.net)
  6.     
  7.     Commenter    Date                Comment
  8.     ---------    -----------------    -----------------------------------------------------
  9.     wolf        Fri, Jun 18, 1999    Created.
  10.     
  11.     ************************************************************************************/
  12.  
  13. #include    "jGNE.h"
  14. #include    "OSUtils.h"
  15.  
  16. #pragma options align=mac68k
  17. typedef    struct    {
  18.     UInt16                    jumpInstruction;    //    always 0x4EF9 (jmp)
  19.     GetNextEventFilterUPP    jumpAddress;
  20. }    jGNEJumpIsland;
  21. #pragma options align=reset
  22.  
  23. jGNEJumpIsland            *gJumpIsland = nil;
  24. GetNextEventFilterUPP    gNextFilter = nil;
  25.  
  26. #if    powerc
  27.     #define        FlushCache( PTR, SIZE )    noErr;MakeDataExecutable((PTR),(SIZE))
  28. #else
  29.     #define        FlushCache( PTR, SIZE )    FlushCodeCacheRange((PTR),(SIZE))
  30. #endif
  31.  
  32. /****************************************************************************************
  33.     Commenter    Date                Comment
  34.     ---------    -----------------    -----------------------------------------------------
  35.     wolf        Tue, Jun 22, 1999    Created.
  36.     
  37.     ************************************************************************************/
  38.  
  39.     OSErr
  40. InstalljGNE(
  41.     GetNextEventFilterUPP    proc )
  42. {
  43.     OSErr    err = noErr;
  44.     
  45.     if( gJumpIsland )
  46.         err = paramErr;
  47.     
  48.     if( !err ) {
  49.         gJumpIsland = (jGNEJumpIsland*) NewPtrSys( sizeof( jGNEJumpIsland ) );
  50.         err = MemError();
  51.         if( !gJumpIsland && !err )
  52.             err = memFullErr;
  53.     }
  54.     
  55.     if( !err ) {
  56.         gJumpIsland->jumpInstruction = 0x4EF9;    //    JMP
  57.         gJumpIsland->jumpAddress = proc;
  58.         err = FlushCache( gJumpIsland, sizeof( jGNEJumpIsland ) );
  59.     }
  60.     
  61.     if( !err ) {
  62.         gNextFilter = LMGetGNEFilter();
  63.         LMSetGNEFilter( (GetNextEventFilterUPP) gJumpIsland );
  64.     }
  65.     
  66.     if( err && gJumpIsland ) {
  67.         DisposePtr( (Ptr) gJumpIsland );
  68.         gJumpIsland = nil;
  69.     }
  70.     
  71.     return( err );
  72. }
  73.  
  74. /****************************************************************************************
  75.     Commenter    Date                Comment
  76.     ---------    -----------------    -----------------------------------------------------
  77.     wolf        Thu, Jun 24, 1999    Created.
  78.     
  79.     ************************************************************************************/
  80.  
  81.     GetNextEventFilterUPP
  82. GetNextjGNE()
  83. {
  84.     return( gNextFilter );
  85. }
  86.  
  87. /****************************************************************************************
  88.     Commenter    Date                Comment
  89.     ---------    -----------------    -----------------------------------------------------
  90.     wolf        Tue, Jun 22, 1999    Created.
  91.     
  92.     ************************************************************************************/
  93.  
  94.     OSErr
  95. RemovejGNE()
  96. {
  97.     OSErr    err = noErr;
  98.     
  99.     if( !gJumpIsland || !gNextFilter )
  100.         err = paramErr;
  101.     
  102.     if( !err ) {
  103.         gJumpIsland->jumpAddress = gNextFilter;
  104.         err = FlushCache( gJumpIsland, sizeof( jGNEJumpIsland ) );
  105.     }
  106.     
  107.     if( !err ) {
  108.         gJumpIsland = nil;
  109.         gNextFilter = nil;
  110.     }
  111.     
  112.     return( err );
  113. }